package com.surekam.core.rsa;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.Inflater;

public class GZIP {

	/**
	 * 字符串的压缩
	 * 
	 * @param str
	 *            待压缩的字符串
	 * @return 返回压缩后的字符串
	 * @throws IOException
	 */
	public static byte[] compress(String str) throws IOException {
		if (null == str || str.length() <= 0) {
			return null;
		}
		// 创建一个新的 byte 数组输出流
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		// 使用默认缓冲区大小创建新的输出流
		GZIPOutputStream gzip = new GZIPOutputStream(out, 910);
		// 将 b.length 个字节写入此输出流
		gzip.write(str.getBytes("UTF-8"));
		gzip.close();
		// 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串
		byte[] byteArray = out.toByteArray();

		return byteArray;
	}

	/**
	 * 字符串的解压
	 * 
	 * @param str
	 *            对字符串解压
	 * @return 返回解压缩后的字符串
	 * @throws IOException
	 */
	public static String unCompress(byte[] str) throws IOException {
		if (null == str || str.length <= 0) {
			return null;
		}
		// 创建一个新的 byte 数组输出流
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		// 创建一个 ByteArrayInputStream，使用 buf 作为其缓冲区数组
		ByteArrayInputStream in = new ByteArrayInputStream(str);
		// 使用默认缓冲区大小创建新的输入流
		GZIPInputStream gzip = new GZIPInputStream(in);
		byte[] buffer = new byte[256];
		int n = 0;
		while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组
			// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流
			out.write(buffer, 0, n);
		}
		// 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串
		return out.toString("UTF-8");
	}

	public static String compresss(String str) throws Exception {
		// Encode a String into bytes
		byte[] input = str.getBytes("UTF-8");

		// Compress the bytes
		byte[] output = new byte[100];
		Deflater compresser = new Deflater(Deflater.BEST_COMPRESSION);
		compresser.setInput(input);
		compresser.finish();
		int compressedDataLength = compresser.deflate(output);
		System.out.println(compressedDataLength);

		return null;
	}

	public static byte[] compresser(String str) throws Exception {
		byte[] bytes = str.getBytes("UTF-8");

		Deflater deflater = new Deflater(9, true);

		deflater.setInput(bytes);

		deflater.finish();

		ByteArrayOutputStream bos = new ByteArrayOutputStream(bytes.length);

		byte[] buffer = new byte[1024];

		while (!deflater.finished()) {

			int bytesCompressed = deflater.deflate(buffer);
			bos.write(buffer, 0, bytesCompressed);
		}

		try {
			bos.close();
		} catch (IOException ioe) {
			System.out.println("Error while closing the stream : " + ioe);
		}

		byte[] compressedArray = bos.toByteArray();

//		System.out.println("Byte array has been compressed!");
//		System.out.println("Size of original array is:" + bytes.length);
//		System.out.println("Size of compressed array is:" + compressedArray.length);
		return compressedArray;
	}

	public static void main(String[] args) throws Exception {
		Main m = new Main();
		String s = m.toJson();

		byte[] compress = GZIP.compress(s);
		System.out.println(compress);
		String unCompress = GZIP.unCompress(compress);
		System.out.println(unCompress);
		String compresss = GZIP.compresss(s);
		System.out.println(compresss);
		GZIP.compresser(s);

	}
}
